package com.ruoyi.demo.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

public class HashUtil {

    // 生成一个包含大小写字母和数字的随机字符串
    private static String generateRandomString(int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(characters.length());
            sb.append(characters.charAt(index));
        }
        return sb.toString();
    }

    // 生成带盐和噪声的哈希值，并确保结果为16位
    public static String generateHash(String inputString, String salt, String noise) throws NoSuchAlgorithmException {
        // 拼接输入字符串、盐值和噪声
        String combinedString = inputString + salt + noise;

        // 使用 SHA-256 计算哈希
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = digest.digest(combinedString.getBytes());

        // 将字节数组转换为十六进制字符串
        StringBuilder hexString = new StringBuilder();
        for (byte b : hashBytes) {
            hexString.append(String.format("%02x", b));
        }

        // 返回前16位作为最终哈希值
        return hexString.substring(0, 16);
    }

    // 创建一个带盐和噪声的16位哈希值
    public static String createSaltedHashedString(String inputString) throws NoSuchAlgorithmException {
        // 生成一个随机字符串作为输入

        // 生成盐值（可以是固定长度的随机字符串）
        String salt = generateRandomString(4);

        // 生成噪声（可以是额外的随机字符串）
        String noise = generateRandomString(4);

        // 使用盐值、噪声和输入字符串生成哈希
        return generateHash(inputString, salt, noise);
    }
}
